(function(root, factory) {
	if (typeof define === 'function' && define.amd && define.amd.jQuery) {
		// AMDJS module definition
		define(['jquery'], function($) {
			return factory($, root);
		});
	} else if (typeof exports === 'object' && module.exports) {
		// CommonJS module definition
		module.exports = factory;
	} else {
		// Global jQuery in web browsers
		return factory(root.jQuery || root.$, root);
	}
}(this, function($, window) {
	
    /**
     * 文本框计数器
	 * @requires jquery.calcFloat.js
     * @example $(selecotr).inputNumber();
     */
	$.fn.inputNumber = function(options) {
        var defaults = {
			decimal     : true,  // 允许小数
			unit        : '',    // 数值单位
            min         : '',    // 最小值
            max         : '',    // 最大值
			step        : 1,     // 步长
			plusBtn     : '.icon-plus',
			minusBtn    : '.icon-minus'
        };
        var opts = $.extend(defaults, options);

		return this.each(function() {
            var _input = $(this),
                _parent = _input.parent(),
                _plusBtn = _parent.children(opts.plusBtn),
                _minusBtn = _parent.children(opts.minusBtn),
                _min = (opts.min === 0 ? '0' : opts.min) || _input.attr('data-min') || -Infinity,
                _max = (opts.max === 0 ? '0' : opts.max) || _input.attr('data-max') || Infinity,
				_step = (options ? opts.step : null) || _input.attr('data-step') || defaults.step;

			// 数值单位
			if (opts.unit) {
				_parent.attr('data-unit', opts.unit);
			}

			// 校验基本参数
			var ckParams = function(params) {
				var flag = true;

				params.forEach(function(item) {
					if (isNaN(item)) {
						console.log(_input.context);
						console.error('"' + item + '" 不是数字');
						flag = false;
					}
				});

				return flag;
			};

			if (!ckParams([_min, _max, _step])) {
				return;
			}

            // 未赋值，非数字值
			if ($.trim(_input.val()) === '' || isNaN(_input.val())) {
                _input.val(_min === -Infinity ? 0 : _min);
            } else if (_input.val() < _min) {  // 小于最小值
				_input.val(_min);
			}

			var numRegEx =	{
				hasSymbol: /-|\./,
				isDecimal: /^(-)?\d+(\.\d+)?$/,
				isInt: /^(^-?\d+$)$/
			};

			/**
			 * 校验文本框输入
			 * @param {string} curVal - 事件触发时文本框的值
			 */
            var ckInputVal = function(curVal) {
                setTimeout(function() {
					var nowVal = $.trim(_input.val()),
						iptVal = nowVal.replace(curVal, '');  // 当前新输入的内容

					if (numRegEx.hasSymbol.test(iptVal)) {  // 包含负号或小数点
						if ((!opts.decimal && iptVal.indexOf('.') > -1)  // 不允许小数
							|| (opts.min === 0 && iptVal.indexOf('-') > -1)) {  // 最小值为0时，不能是负数
							_input.val(curVal);
						}
					} else if (isNaN(iptVal)) {
						_input.val(curVal);
					}
                }, 10);
            };

            _input.on({
                'keydown.inputNumber': function() {
                    ckInputVal($(this).val());
                },
                'paste.inputNumber': function() {
                    ckInputVal($(this).val());
                },
                'blur.inputNumber': function() {
					var $self = $(this),
						curVal = $.trim($self.val());

					if (curVal === '') {
						return;
					}

					if (numRegEx.isInt.test(curVal) || numRegEx.isDecimal.test(curVal)) {
						if (_max && curVal > _max) {
							$self.val(_max);
						} else if (_min && curVal < _min) {
							$self.val(_min);
						}
					} else {
						if (curVal.lastIndexOf('-') > 0) {  // 负号位置不合法
							$self.val(
								(curVal.indexOf('-') === 0 ? '-' : '') + curVal.replace(/-/g, '')
							);
						}

						curVal = $.trim($self.val());

						if (!numRegEx.isDecimal.test(curVal)) {  // 小数格式不合法
							var curValArr = curVal.split('.').filter(function(item) {
									return String(item) || null;  // 过滤空值
								}),
								result = '';

							if (curValArr.length > 1) {
								for (var i = 0; i < curValArr.length; i++) {
									if (curValArr[i] !== '') {
										result += curValArr[i] + (i === 0 ? '.' : '');
									}
								}

								$self.val(result);
							} else {
								$self.val(curValArr[0]);
							}
							curValArr = null;
						}
					}
                }
            });

			if (_plusBtn.length && _minusBtn.length) {  // 有控制按钮
				if (typeof $.calcFloat === 'undefined') {
					throw '必须先引入本插件依赖的 calcFloat 插件！';
					return;
				}

                // 计数器加
                _plusBtn.click(function() {
					if (_input.is(':disabled')) {
						return;
					}

                    var value = Number(_input.val()),
						result = $.calcFloat.plus(value, _step);

                    if (result <= _max) {
						_input.val(result);
					}
				});

                // 计数器减
                _minusBtn.click(function() {
					if (_input.is(':disabled')) {
						return;
					}

                    var value = Number(_input.val()),
						result = $.calcFloat.minus(value, _step);

                    if (result >= _min) {
						_input.val(result);
					}
                });
            } else {
				_parent.addClass('nocontrols');  // 无控制按钮样式，还原文本框右侧内补丁
			}
        });
    };

}));


